#ifndef _COMMOCONNECTIONPOOL_H_
#define _COMMOCONNECTIONPOOL_H_

#include <iostream>
#include <queue>
#include <mutex>
#include <string>
#include "pch.h"
#include <atomic>
#include <thread>
#include <functional>
#include <memory>
#include <condition_variable>
#include <error.h>

#include "public.h"
#include "Connection.h"

using namespace std;

class ConnectionPool
{

public:
    static ConnectionPool *getConnectionPool(); //获取实例对象(单例)

    shared_ptr<Connection> getConnection(); //获取队列中的Connection
private:
    ConnectionPool();      //构造函数私有化
    bool loadConfigFile(); //读取配置文件

    void produceConnectionTask(); //生产者线程函数

    void scannerConnectionTask();

private:
    //连接池变量
    string _ip;             // ip地址
    unsigned short _port;   //端口号
    string _username;       //数据库用户名
    string _passwd;         //数据库密码
    string _dbname;         //连接的数据库名称
    int _initSize;          //初始连接数
    int _maxSize;           //最大连接数
    int _maxIdleTime;       //连接池的最大空闲时间
    int _connectionTimeout; //连接器获取连接的超时时间

    queue<Connection *> _connectionQue; // 存储mysql连接的队列
    mutex _queueMutex;                  // 维护连接队列的线程安全互斥锁
    atomic_int _connectionCnt;          // 记录连接所创建的connection连接的总数量,原子操作线程安全
    condition_variable cv;              //条件变量
};

#endif